package cn.itcast.service.cargo.impl;

import cn.itcast.dao.cargo.ContractDao;
import cn.itcast.dao.cargo.ContractProductDao;
import cn.itcast.dao.cargo.ExtCproductDao;
import cn.itcast.domain.cargo.*;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.vo.ContractProductVo;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class ContractProductServiceImpl implements ContractProductService {
  @Autowired
  private ContractProductDao contractProductDao;
  @Autowired
  private ContractDao contractDao;
  @Autowired
  private ExtCproductDao extCproductDao;
  /**
   * 分页查询
   *
   * @param ContractProductExample 分页查询的参数
   * @param pageNum                当前页
   * @param pageSize               页大小
   * @return
   */
  @Override
  public PageInfo<ContractProduct> findByPage(ContractProductExample ContractProductExample, int pageNum, int pageSize) {
    PageHelper.startPage(pageNum, pageSize);
    //查找对应的数据
    List<ContractProduct> contractProductList = contractProductDao.selectByExample(ContractProductExample);
    return new PageInfo<>(contractProductList);
  }

  /**
   * 查询所有
   *
   * @param ContractProductExample
   */
  @Override
  public List<ContractProduct> findAll(ContractProductExample ContractProductExample) {
    return contractProductDao.selectByExample(ContractProductExample);
  }

  /**
   * 根据id查询
   *
   * @param id
   */
  @Override
  public ContractProduct findById(String id) {
    return contractProductDao.selectByPrimaryKey(id);
  }

  /**
   * 新增
   *
   * @param contractProduct
   */
  @Override
  public void save(ContractProduct contractProduct) {
    contractProduct.setId(UUID.randomUUID().toString());
    //注意： 因为创建时间与更新时间字段不能为空，所以我们在插入数据的时候需要补充这两个字段的值
    contractProduct.setCreateTime(new Date());
    contractProduct.setUpdateTime(new Date());
    // 1. 计算出货物的总价
    double amount = 0;
    if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
      amount = contractProduct.getCnumber() * contractProduct.getPrice();
      contractProduct.setAmount(amount);
    }
    //2. 插入一个货物的记录
    contractProductDao.insertSelective(contractProduct);
    //3. 重新计算购销合同的总价
    //找到到购销合同
    Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
    if (contract.getTotalAmount() == null) {
      // 第一次添加货物,购销合同的总价等于当前货物总价
      contract.setTotalAmount(amount);
    } else {
      contract.setTotalAmount(contract.getTotalAmount() + amount);
    }
    // 4. 重新计算购销合同的产品的种类数量(原来的种类数量+1)
    contract.setProNum(contract.getProNum()+1);
    //5. 更新购销合同
    contractDao.updateByPrimaryKeySelective(contract);
  }

  /**
   * 修改
   *
   * @param contractProduct
   */
  @Override
  public void update(ContractProduct contractProduct) {
    contractProduct.setUpdateTime(new Date());
    //找到更新货物之前的货物数据
    ContractProduct dbContractProduct = contractProductDao.selectByPrimaryKey(contractProduct.getId());
    //1. 计算出货物的总价
    double amount = 0;
    if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
      amount = contractProduct.getCnumber() * contractProduct.getPrice();
      contractProduct.setAmount(amount);
    }
    //2. 更新货物的记录
    contractProductDao.updateByPrimaryKeySelective(contractProduct);
    //3. 重新计算购销合同的总价   购销合同的总价 =  购销合同的原本总价 - 货物修改之前的总价(100) + 货物当前的总价(200)
    Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
    contract.setTotalAmount(contract.getTotalAmount() - dbContractProduct.getAmount() + amount);
    //4. 更新购销合同
    contractDao.updateByPrimaryKeySelective(contract);
  }

  /**
   * 删除 根据货物的id删除
   *
   * @param id
   */
  @Override
  public void delete(String id) {
    //找到马上要被删除货物对象
    ContractProduct dbContractProduct = contractProductDao.selectByPrimaryKey(id);
    //1. 删除货物
    contractProductDao.deleteByPrimaryKey(id);
    //2. 删除附件 (一个货物是可能出现多个附件的)
    //找到附件
    ExtCproductExample extCproductExample = new ExtCproductExample();
    extCproductExample.createCriteria().andContractIdEqualTo(id);
    List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);
    //保存所有附件的总价
    int totalExtAmount = 0;
    if (extCproductList != null) {
      for (ExtCproduct extCproduct : extCproductList) {
        totalExtAmount += extCproduct.getAmount();
        //遍历所有的附件，然后逐个删除
        extCproductDao.deleteByPrimaryKey(extCproduct.getId());
      }
    }
    //3. 重新计算购销合同的总价   购销合同的总价 = 购销合同原始的总价 - 货物的总价 - 附件的总价
    //找到购销合同
    Contract contract = contractDao.selectByPrimaryKey(dbContractProduct.getContractId());
    contract.setTotalAmount(contract.getTotalAmount() - dbContractProduct.getAmount() - totalExtAmount);
    //4. 修改购销合同的货物的数量
    contract.setProNum(contract.getProNum() - 1);
    //5. 修改购销合同的附件的数量
    if (extCproductList != null) {
      contract.setExtNum(contract.getExtNum() - extCproductList.size());
    }
    //6. 更新购销合同
    contractDao.updateByPrimaryKeySelective(contract);
  }

  /**
   * 根据船期查找货物
   *
   * @param companyId
   * @param shipTime
   */
  @Override
  public List<ContractProductVo> findByShipTime(String companyId, String shipTime) {
    return contractProductDao.findByShipTime(companyId, shipTime);
  }
}
